//一个整型数组 nums 里除两个数字之外，其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n)，空间复杂度是O(1)。
//
//
//
// 示例 1：
//
// 输入：nums = [4,1,4,6]
//输出：[1,6] 或 [6,1]
//
//
// 示例 2：
//
// 输入：nums = [1,2,10,4,1,4,3,3]
//输出：[2,10] 或 [10,2]
//
//
//
// 限制：
//
//
// 2 <= nums.length <= 10000
//
//
//
//
// Related Topics 位运算 数组 👍 823 👎 0


//leetcode submit region begin(Prohibit modification and deletion)
function singleNumbers(nums: number[]): number[] {

    /**
     * @param {number[]} nums
     * @return {number[]}
     */
//? 异或特性：两值相同为0 不同为1 任何数与0异或为该数 所以异或完只剩下两个只出现一次的数字的异或结果
    let count = 0, index = 0, ans1 = 0, ans2 = 0
    //? 得到数组全部的异或结果(也就是两个出现一次的数字的异或结果)
    for (let num of nums) {
        count ^= num
    }
    //? 找异或和第一个为1的位 因为在1的位置上 两个出现一次的数字的这一位是不同的
    //? &是按位与 两个数每个位都是对应的两个输入数的位进行按位与运算
    //? 所以这里就是找count的最后一位1在哪
    while (!(count & 1)) {
        //? 向右移动并重新赋值给count
        count >>= 1
        //? 拿到在哪一位
        index++
    }
    //? 以该位为依据分组异或
    for (let num of nums) {
        //? 这个位次为1为1组 异或结果一定是为1的数
        if ((num >> index) & 1) {
            ans1 ^= num
        } else {
            //? 这个位次为0的是一组
            ans2 ^= num
        }
    }
    return [ans1, ans2]

};
//leetcode submit region end(Prohibit modification and deletion)
